From e81218b658e842507711f74676a0f84e9f191f0a Mon Sep 17 00:00:00 2001 From: "djm@kirby.fc.hp.com" Date: Sun, 18 Sep 2005 10:30:57 -0600 Subject: [PATCH] Re-enable improved PAL code (time and perfmon work again). PAL code remapped _lazily_ only when PAL called after rr7 changes. Old PAL emulator can be re-enabled with #define USE_PAL_EMULATOR in config.h. Signed-off by: Dan Magenheimer --- xen/arch/ia64/linux-xen/efi.c | 31 ++++++++++++++++++++++++++++--- xen/arch/ia64/xen/dom_fw.c | 23 +++++++++++++---------- xen/include/asm-ia64/config.h | 1 + 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/xen/arch/ia64/linux-xen/efi.c b/xen/arch/ia64/linux-xen/efi.c index e2ba47d000..c75f0fe728 100644 --- a/xen/arch/ia64/linux-xen/efi.c +++ b/xen/arch/ia64/linux-xen/efi.c @@ -525,7 +525,7 @@ efi_get_pal_addr (void) #ifdef XEN -void *pal_vaddr; +void *pal_vaddr = 0; #endif void @@ -533,14 +533,39 @@ efi_map_pal_code (void) { #ifdef XEN u64 psr; - pal_vaddr = efi_get_pal_addr (); + static unsigned long last_rr7 = 0; + unsigned long current_rr7 = ia64_get_rr(7L<<61); + + // this routine is called only once in Linux but may be called + // multiple times in Xen. However, we only need to flush and + // reset itr[IA64_TR_PALCODE] if rr7 changes + if (!pal_vaddr) { + pal_vaddr = efi_get_pal_addr (); + last_rr7 = current_rr7; + } + else if (last_rr7 == current_rr7) return; + else { + last_rr7 = current_rr7; + printk("efi_map_pal_code,remapping pal w/rr7=%lx\n",last_rr7); + } + + printf("efi_map_pal_code: about to ia64_ptr(%d,%p,%p)\n", + 0x1, GRANULEROUNDDOWN((unsigned long) pal_vaddr), + IA64_GRANULE_SHIFT); + ia64_ptr(0x1, GRANULEROUNDDOWN((unsigned long) pal_vaddr), + IA64_GRANULE_SHIFT); + ia64_srlz_i(); + printf("efi_map_pal_code: about to ia64_itr(%p,%p,%p,%p,%p)\n", + 0x1, IA64_TR_PALCODE, GRANULEROUNDDOWN((unsigned long) pal_vaddr), + pte_val(pfn_pte(__pa(pal_vaddr) >> PAGE_SHIFT, PAGE_KERNEL)), + IA64_GRANULE_SHIFT); #else void *pal_vaddr = efi_get_pal_addr (); u64 psr; -#endif if (!pal_vaddr) return; +#endif /* * Cannot write to CRx with PSR.ic=1 diff --git a/xen/arch/ia64/xen/dom_fw.c b/xen/arch/ia64/xen/dom_fw.c index a6f5cec450..ca22fafacc 100644 --- a/xen/arch/ia64/xen/dom_fw.c +++ b/xen/arch/ia64/xen/dom_fw.c @@ -291,16 +291,18 @@ xen_pal_emulator(unsigned long index, unsigned long in1, long r11 = 0; long status = -1; -#define USE_PAL_EMULATOR -#ifdef USE_PAL_EMULATOR - return pal_emulator_static(index); -#endif if (running_on_sim) return pal_emulator_static(index); if (index >= PAL_COPY_PAL) { - printk("xen_pal_emulator: UNIMPLEMENTED PAL CALL %d!!!!\n", - index); + // build_hypercall_bundle needs to be modified to generate + // a second bundle that conditionally does a br.ret + panic("xen_pal_emulator: stacked calls not supported!!\n"); } - else switch (index) { + printk("xen_pal_emulator: index=%d\n",index); + // pal code must be mapped by a TR when pal is called, however + // calls are rare enough that we will map it lazily rather than + // at every context switch + efi_map_pal_code(); + switch (index) { case PAL_MEM_ATTRIB: status = ia64_pal_mem_attrib(&r9); break; @@ -514,11 +516,12 @@ dom_fw_init (struct domain *d, char *args, int arglen, char *fw_mem, int fw_mem_ */ memset(fw_mem, 0, fw_mem_size); -#ifdef XEN -#else +#ifdef USE_PAL_EMULATOR pal_desc = (unsigned long *) &pal_emulator_static; - sal_desc = (unsigned long *) &sal_emulator; +#else + pal_desc = (unsigned long *) &xen_pal_emulator; #endif + sal_desc = (unsigned long *) &sal_emulator; cp = fw_mem; efi_systab = (void *) cp; cp += sizeof(*efi_systab); diff --git a/xen/include/asm-ia64/config.h b/xen/include/asm-ia64/config.h index 5e13f290ba..268cd3ebff 100644 --- a/xen/include/asm-ia64/config.h +++ b/xen/include/asm-ia64/config.h @@ -1,6 +1,7 @@ #ifndef _IA64_CONFIG_H_ #define _IA64_CONFIG_H_ +#undef USE_PAL_EMULATOR // control flags for turning on/off features under test #undef CLONE_DOMAIN0 //#define CLONE_DOMAIN0 1 -- 2.30.2